package family

import (
	"errors"
	"encoding/json"
	"homeserver/worker"
)

const (
	NOTIFY_DEV_LOGOUT	= "logout"
	NOTIFY_SEV_DEV				= "dev"
	NOTIFY_SEV_TEMP_T 			= "temp"
	NOTIFY_SEV_SWITCH_T 		= "switch"
	NOTIFY_SEV_FAMILY_MSG 		= "family-message"
	NOTIFY_SEV_FAMILY_MSG_INFO 		= "info"
	NOTIFY_SEV_FAMILY_MSG_ERR 		= "err"
)


//
// 成员->家庭中心 操作请求约定
//
type SevRequest struct {
	DevId 		string 				`json:"dev"`
	SevId 		string				`json:"sev"`
	Operate 	SevRequestInfo		`json:"operate"`
}

//
// 操作请求格式
//
type SevRequestInfo struct {
	Type 	string		`json:"type"`
	Data 	string		`json:"data"`
}

//
// 家庭中心->终端通信格式约定
//
type FamilyNotifyInfo struct {
	DevId 		string		`json:"dev"`
	SevId 		string		`json:"sev"`
	State 		string		`json:"state"`
	Desc 		string 		`json:"desc"`
}

// 家庭中心消息通知包
type FamilyNotifyPacket struct {
	MemId 	string					`json:"mem"`
	Data  	*FamilyNotifyInfo		`json:"data"`
}


// 家庭中心操作请求包
type FamilyRequestPacket struct {
	MemId 	string			`json:"mem"`
	Data  	interface{}		`json:"data"`
}



// 设备通知消息
type DevNotify struct {
	Dev 		string			`json:"dev"`
	Sev 		string			`json:"sev"`
	Notify 		DevNotifyInfo	`json:"notify"`
}

// 通知内容
type DevNotifyInfo  struct {
	Type 		string			`json:"type"`
	Data 		interface{}		`json:"data"`
}

//
type SevFamily struct {
	request chan 	[]byte		// 消息请求通道
	notify 	chan 	[]byte		// 通知处理通道
}


//
// 家庭中心处理通知消息
//
func (f *SevFamily) handleNotify(data []byte) (err error){

	// 解析
	var packet DevNotify
	err = json.Unmarshal(data, &packet)
	if err != nil {
		return
	}

	// 找到设备所属的家庭
	family, ok := DevFamilyMap[packet.Dev]
	if !ok {
		return
	}

	// 消息类型
	if packet.Sev == NOTIFY_SEV_DEV {
		// 加油家庭处理
		return family.handleNotifyDev(packet.Dev, packet.Notify.Type)
	}

	return family.handleNotifySev(packet.Dev, packet.Sev, packet.Notify.Type, packet.Notify.Data)
}

//
// 处理来自成员的操作请求消息
//
func (f *SevFamily) handleRequest(data []byte) (err error) {

	familyLogger.Info("request: %s", string(data))

	var request FamilyRequestPacket
	err = json.Unmarshal(data, &request)
	if err != nil {
		return
	}

	buf, err := json.Marshal(request.Data)
	if err != nil {
		return
	}

	familyLogger.Info("member: %s request: %s", request.MemId, string(buf))

	return requestDevice(buf)
}

//
// 实现设备消息通知接口
//
type DevNotifyHandle struct {}

//
func (dev *DevNotifyHandle) Notify(buffer []byte) (err error)  {

	err = errors.New("404")
	if SevFamilyHandle == nil {
		return
	}

	familyLogger.Info("%s", string(buffer))

	SevFamilyHandle.notify <- buffer


	return nil
}

//
// 向设备终端订阅消息
//
func subDeviceNotify() error {
	handle  := &DevNotifyHandle{}
	return worker.SubScribeNotify(handle)
}

//
// 启动家庭服务
//
func StartSevFamily(end chan bool) {
	sev := &SevFamily{}
	sev.notify = make(chan []byte, 4)
	sev.request = make(chan []byte, 4)

	subDeviceNotify()

	SevFamilyHandle = sev
	defer func() {
		SevFamilyHandle = nil
		close(sev.notify)
		close(sev.request)
		end <- true
	}()

	for {
		select {

		// 请求
		case data, ok := <- sev.request:
			if ok {
				sev.handleRequest(data)
			} else {
				break
			}

		// 通知
		case data, ok := <- sev.notify:
			if ok {
				sev.handleNotify(data)
			} else {
				break
			}

		}
	}

}
